perm filename DSKDMP.FAI[SS,SYS]12 blob sn#804878 filedate 1986-01-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00019 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00006 00002	 TYPXFR DEBSW DSKDSW DSKDBG KLBOOT RHDSK FT1DSK EXTNEW KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ
C00015 00003	 PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0
C00021 00004	 C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
C00026 00005	 C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
C00032 00006	 MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP
C00037 00007	DSKDMP.DMP FORMAT
C00041 00008	 LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS
C00049 00009	 LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
C00065 00010	 FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1
C00070 00011	 SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1
C00081 00012	 TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1
C00088 00013	 C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN FDEV
C00096 00014	 FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY1 .R7TY2 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG
C00107 00015	 BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI
C00114 00016	 GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2
C00121 00017	 RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO
C00131 00018	 CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2
C00137 00019	 FF
C00138 ENDMK
C⊗;
;⊗ TYPXFR DEBSW DSKDSW DSKDBG KLBOOT RHDSK FT1DSK EXTNEW KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ

;ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS

;"BOOT" means the program that's loaded into 11 memory that runs in response to
;the DS command in KLDCP.
;
;"DSKDMP" means the program that's run by BOOT.  It generally has DDT and a
;file name scanner, etc.

TYPXFR←←0	;Nonzero to type out a character for each disk xfer done OK
DEBSW←←0	;If BOOT, 0 for paper tape, 1 for DECtape with EDDT
		;If DSKDMP, 0 for real DSKDMP, 1 for DSKDMP with EDDT
DSKDSW←←0	;0 for BOOT, 1 for DSKDMP
DSKDBG←←0	;1 for being able to load DSKDMP with EDDT, fixes symb tab ptr
KLBOOT←←1	;If BOOT, 1 for KLDCP loadable BOOT, 0 for paper tape
RHDSK←←1	;Nonzero for RH20 disks, else C1 channel disks
FT1DSK←←1	;1 if all C1 disk packs are on same controller (not RHDSK)
EXTNEW←←3	;If BOOT, 0 finds DSKDMP.DMP, 1 finds .NEW, 2 .OLD, 3 .TST
KACODE←←0	;1 to include run time checks for KA-10 and KASIM microcode

NPACKS←←8	;number of disk drives on C1 channel

XALL	;suppress macro expansion in listing

DEFINE SWLIST <FOR SWITCH IN (TYPXFR,DEBSW,DSKDSW,DSKDBG,KLBOOT,RHDSK,FT1DSK,EXTNEW)>

DEFINE VALPNT (VAL) <
PRINTS /VAL/
>
PRINTS /SWITCHES ARE:
/

SWLIST <
PRINTS /SWITCH(/
VALPNT (\SWITCH)
PRINTS /) /
>

PRINTS /
/

repeat 0,<
PRINTS /Type new values for these symbols, if any, followed by CONTROL-META-LF
/
.INSERT TTY:
>;repeat 0

SWLIST <
IFDIF <SWITCH><EXTNEW><
IFN SWITCH,<↓SWITCH←←1>
IFE SWITCH,<↓SWITCH←←0>
>;IFDIF
>;SWLIST
IFL EXTNEW,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
IFG EXTNEW-3,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
↓EXTNEW←←EXTNEW

IFN DSKDSW,<KLBOOT←←0>
IFN KLBOOT,<
DEBSW ←← 0
DSKDBG ←← 0
>;IFN KLBOOT

IFN DSKDSW,<
TITLE DSKDMP
>;IFN DSKDSW

IFE DSKDSW,<
IFE EXTNEW,<	TITLE BOOT	>
IFE EXTNEW-3,<	TITLE TBOOT	>
IFE EXTNEW-2,<	TITLE OBOOT	>
IFE EXTNEW-1,<	TITLE NBOOT	>
>;IFE DSKDSW

F←0
A←1
B←2
C←3
D←4
repeat 0,< ;unused
E←5
H←7
J←10
K←11
L←12
M←13
>;repeat 0
ifn rhdsk,<
P1←5
P2←6
P3←7
P4←10
T1←11
T2←12
T3←13
>;ifn rhdsk
N←14
T←15
TT←16
P←17

HILOC←←135

NUFDWD←←20

IFN DSKDSW,<
;RIGHT HALF F BITS
RBO←←1			;DOING RUBOUT NOW
>;IFN DSKDSW

IFE RHDSK,<
↓CUADR←←6			;CONTROL UNIT ADDRESS
>;IFE RHDSK

;Device codes
APR←←0
PI←←4
KLPAG←←10
CCA←←14
TTY←←120
IFE RHDSK,<
C1A←←140
C1B←←144
>;IFE RHDSK
DTE0←←200

;KL10 PARAMETERS, offsets within EPT
DTFLG←←444		;DTE20 OPERATION COMPLETE FLAG
DTF11←←450		;      FROM 11 ARGUMENT
DTCMD←←451		;      TO 11 COMMAND

IFN KACODE,<
DEFINE SKPKA <CONSO TTY,1B28>	;SKIP IF THIS IS THE KA10
DEFINE SKPKL <CONSZ TTY,1B28>	;SKIP IF THIS IS THE KL10
>;IFN KACODE
IFE KACODE,<
;DEFINE SKPKA <CAI>		;SKIP IF THIS IS THE KA10 (never)
;DEFINE SKPKL <CAIA>		;SKIP IF THIS IS THE KL10 (always)
>;IFE KACODE

DONG11←←20000				;DTE CONO BIT.  REQUEST 11 INTERRUPT
SWEEPB←←200000				;KL10 APR CONI BIT - SWEEP BUSY
PIOFF←←400

IFN DEBSW,<
	LOC 74
	JRST DDT↑
IFN DSKDSW,<
	LOC 140
	274
	FF
	LOWEST
>;IFN DSKDSW
	LOC 300
	JRST DDT
IFE DSKDSW,<
	JRST BOOT
	LOC 100000
>;IFE DSKDSW
IFN DSKDSW,<
	JRST DSKDMP
	LOC 500000	;arbitrary I think, used to be 300000
>;IFN DSKDSW
DSTART::
>;IFN DEBSW

IFE DEBSW,<
IFN DSKDSW,<
DSTART←←760000		;address where DSKDMP code will start
	LOC 140
	DSTART		;LOCATION FOR LOADING STARTING AT 274
	FF		;FIRST FREE
	LOWEST		;LOWEST LOCATION USED
	LOC 274
	PHASE DSTART
>;IFN DSKDSW
>;IFE DEBSW

IFN RHDSK,<
IFE KLBOOT,<
KLEPT←<DSTART-2000>&777000 ;the KL EPT will be in the 2nd previous page
A%FP0←<DSTART-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFE KLBOOT
>;IFN RHDSK
IFE RHDSK,<
KLEPT←←0
>;IFE RHDSK

R2WLSH←←7		;amount to shift record count to make word count
RECSIZ←←<1⊗R2WLSH>	;size of a data record, in words
IFE RHDSK,<
RTLSIZ←←40		;size of retrieval disk sector in words
DATRPB←←=18		;data records per block
>;IFE RHDSK
IFN RHDSK,<
RTLSIZ←←200		;size of retrieval disk sector in words
DATRPB←←=8		;data records per block
WDPCHN←←4		;number of words in logout area of a single RH20 channel
>;IFN RHDSK
DATSIZ←←DATRPB*RECSIZ	;size of disk block, not counting retrieval area
BLKSIZ←←DATSIZ+RTLSIZ	;size of disk block in words, incl retrieval area
;⊗ PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0

;WRITE OUT RIM FORMAT BOOT, PNCHGO

IFE DSKDSW,<
IFE KLBOOT,<
IFE DEBSW,<

PTPC←←1
PTR←←104

LOC 200

PNCHGO:	RESET
	MOVE P,[-20,,RIMPDL]
	INIT PTPC,13
	SIXBIT /PTP/
	OBUF,,
	JRST 4,.
	MOVSI C,-RIMLDL
GO1:	MOVE A,RIMLDR(C)
	PUSHJ P,PUNCH
	AOBJN C,GO1
	MOVEI D,0		;INITIALIZE CHECKSUM
	MOVE A,[BOOTBG,,BOOTBG]
	PUSHJ P,PUNCHC
	MOVSI C,BOOTBG
GO2:	MOVE A,BOOTLO(C)
	PUSHJ P,PUNCHC		;PUNCH AND CHECKSUM
	AOBJN C,GO2
	MOVE A,D
	PUSHJ P,PUNCH		;PUNCH OUT CHECKSUM
	MOVE A,[JRST BOOT]
	PUSHJ P,PUNCH
	MOVEI A,0
	PUSHJ P,PUNCH
	EXIT

PUNCHC:	ROT D,1
	ADD D,A
PUNCH:	SOSG OBUF+2
	OUT PTPC,
	CAIA
	JRST 4,.
	IDPB A,OBUF+1
	POPJ P,

RIMLDR:	-17,,0			;IOWD TO RIM LOADER
	CONO PTR,60
	HRRI 11,4
	CONSO PTR,10
	JRST 3
	ROT 0,-2(11)
	DATAI PTR,@10(11)
	XCT 10(11)
	XCT 13(11)
	SOJA 11,0
	CAME 0,17
	ADD 0,(17)
	SKIPL 17,0
	JRST 4,1
	AOBJN 17,3
	JRST 2
RIMLDL←←.-RIMLDR

RIMPDL:	BLOCK 20
OBUF:	BLOCK 3

LIT
VAR

LOC 1000

BOOTLO:
IFE RHDSK,<
BOOTBG←←777000
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000	;need more room for RH version
>;IFN RHDSK
PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
>;IFE KLBOOT
>;IFE DSKDSW

IFN DEBSW,<
IFE DSKDSW,<
XBUF:	BLOCK BLKSIZ
>;IFE DSKDSW
>;IFN DEBSW

IFN KLBOOT,<
IFE DEBSW,<
IFE RHDSK,<
BOOTBG←←777000	;CHANGE TO 777000 WHEN SOME MEMORY IS UP THERE
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000	;need more room for RH version (allow room for symbols)
>;IFN RHDSK
	LOC 140
	BOOTBG
	FF
	LOWEST
	LOC 274
	PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
IFN RHDSK,<
NDATA←←100		;max number of data words outside code loaded in KLDCP
BDATA←←XBUF-NDATA	;place where data area starts
KLEPT←<XBUF-NDATA-2000>&777000 ;the KL EPT will be in the 2nd page preceding XBUF
A%FP0←<XBUF-NDATA-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFN RHDSK
>;IFN KLBOOT

.DATA←←BDATA		;initialize address to beginning of data area
DEFINE DATAWD(SYM,LEN)<
SYM←.DATA
.DATA←←.DATA+LEN	;allocate LEN words at SYM
IFG .DATA-BDATA-NDATA,<.FATAL Increase NDATA (data area size) and recompile>
>;DEFINE
;⊗ C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK

;C1 CHANNEL DEFINITIONS

IFE RHDSK,<

;CONO C1A BITS

C1SBI←←400000		;SELECT BUS INTERFACE
  C1RSI←←40000		;RESET INTERFACE
  C1SRUN←←10000		;SET CLOCK RUN
  C1CONT←←2000		;CONTINUE CLOCK
C1SCH←←200000		;SELECT CHANNEL
  C1RST←←40000		;RESET CHANNEL
  C1CCIF←←20000		;CLEAR CHANNEL INTERRUPT FLAG
  C1INTE←←10000		;INTERRUPT ENABLE
  C1INTD←←4000		;INTERRUPT DISABLE
  C1SCF1←←2000		;SET CF1
  C1CCF1←←1000		;CLEAR CF1
  C1MPCN←←400		;CONTINUE MICROPROCESSOR
  C1LCD←←20		;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
  C1LPT←←11		;LOAD PROGRAM TABLE STARTING ADDRESS
  C1SYSR←←2		;SYSTEM RESET
  C1SCAN←←7		;SCAN PROGRAM TABLE FOR PROGRAMS TO START

C1SDIA←←100000		;SELECT DIAGNOSTIC FUNCTIONS

;CONI C1A BITS

CIF←←4			;CHANNEL INTERRUPT FLAG
CF1←←2			;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1			;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)

C1UCHK←←2		;UNIT CHECK IN IBM STATUS BYTE

>;IFE RHDSK
;⊗ C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST

;C1 CHANNEL DATA AREA PARAMETERS

IFE RHDSK,<

;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000			;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000			;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000			;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000			;TEST I/O
C1IWC←←010000			;IGNORE WORD COUNT
C1BAK←←004000			;BACKWARDS
C1NATM←←000000			;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000			;BYTE MODE
C1CBYT←←000400			;COUNT BYTES
				;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20			;STOP ON LENGTH ERROR
C1CEC←←10			;CHANNEL END CONTINUE
C1NOC←←2			;NO CHAINING
C1RPT←←1			;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS




;PROGRAM TABLE
C1CCW←←0			;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1			;INTERRUPT SOURCE WORD
   C1PTPE←←100000		;PARITY ERROR IN PROGRAM TABLE
   C1PTNX←←40000		;NXM IN PROGRAM TABLE
   C1IQF←←20000			;INTERRUPT QUEUE FULL
C1PPTR←←2			;FIRST PROGRAM POINTER

;PROGRAM HEADER AND PROGRAM
C1PCW←←0			;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
   C1BW←←100			   ;BUSY WAIT BIT IN PCW
C1STA←←1			;STATUS A
  ;RIGHT HALF BITS
   C1HLT←←400000		;PROGRAM EXECUTED A HALT
   C1LE←←200000			;LENGTH ERROR
   C1SE←←100000			;SELECT ERROR
   C1PE←←040000			;PARITY ERROR
   C1NXM←←020000		;NXM
   C1BPE←←010000		;IBM BUS PARITY ERROR
   C1SSE←←002000		;SIGNAL SEQUENCE ERROR
  ;LEFT HALF BITS
   C1PCMA←←100000		;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2			;STATUS B
C1STC←←3			;STATUS C
C1INST←←4			;FIRST INSTRUCTION OF CHANNEL PROGRAM
>;IFE RHDSK
;⊗ MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP

;FILE SYSTEM PARAMETERS

IFE RHDSK,<
MFDLOC←←1		;TRACK CONTAINING MFD

TRKCYL←←=19		;19 HEADS PER CYLINDER
CYLPK←←=815		;815 CYLINDERS PER PACK
TRKPK←←TRKCYL*CYLPK	;19*815=15485 TRACKS PER PACK
>;IFE RHDSK

;RETRIEVAL INFORMATION

NXTQQQ←←0

DEFINE ZWD (A) <
A←←NXTQQQ
NXTQQQ←←NXTQQQ+1
>

	ZWD DDNAM	;FILE NAME
	ZWD DDEXT	;FILE EXTENSION,,DATE WRITTEN,CREATION DATE
	ZWD DDPRO	;PROTECTION,MODE,TIME,DATE WRITTEN
	ZWD DDPPN	;PPN
	ZWD DDLOC	;FIRST DISK ADDRESS OF THIS FILE
	ZWD DDLNG	;LENGTH OF FILE IN WORDS
	ZWD DREFTM
	ZWD DDMPTM
	ZWD DGRP1R	;FIRST USER RCRD NO. THIS GRP
	ZWD DNXTGP	;BLOCK NUMBER OF NEXT GROUP
	ZWD DSATID
	ZWD DQINFO	;START OF SPECIAL STORAGE FOR LOGIN ETC.
NXTQQQ←←NXTQQQ+3
	ZWD DOFFST	;RECORD OFFSET
	ZWD DPTR	;RETRIEVAL DATA, 2 BLK NO.'S/WORD

IFE RHDSK,<
DPTRBP←←<POINT 18,DPTR>	;C1 disk format uses half-word retr ptrs
DPTEBP←←<POINT 18,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFE RHDSK
IFN RHDSK,<
DPTRBP←←<POINT 36,DPTR>	;RP07 format uses full-word retr ptrs
DPTEBP←←<POINT 36,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFN RHDSK
;DSKDMP.DMP FORMAT

COMMENT ⊗

DSKDMP.DMP[SS,SYS] IS AN ORDINARY DUMP FILE EXCEPT THAT IT HAS BEEN
ASSEMBLED WITH A PHASE STATEMENT AND EXPECTS TO BE LOADED HIGH IN
THE FIRST 256K OF CORE.  LOCATION 140 OF THE CORE IMAGE THAT WOULD
HAVE BEEN OBTAINED BY LOADING DSKDMP CONTAINS THE STARTING ADDRESS
FOR LOADING.  LOCATION 274 IS THE FIRST WORD THAT SHOULD BE LOADED
THERE.  LOCATION 141 CONTAINS THE RELOCATED FIRST FREE ADDRESS, 142
CONTAINS THE RELOCATED LOWEST ADDRESS.  THESE TWO LOCATIONS ARE USED
ONLY BY THE CNVRT PROGRAM TO MAKE DSKDMP.D10

⊗
;⊗ LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS

;BOOT BEGINS HERE

IFE DSKDSW,<
LOWEST←←.
BOOT:	CONO APR,200000		;RESET
	SETZM KASIM
IFN RHDSK,<
	CONO KLPAG,KLEPT⊗-9	;TURN OFF CACHE.  set EPT address.  TURN OFF MAP
>;IFN RHDSK
IFN KACODE,<
	BLKI APR,A		;GET UCODE OPTIONS INTO BITS 0-8 OF A
	TLNE A,100000		;SKIP UNLESS KA SIMULATION UCODE LOADED
	SETOM KASIM
>;IFN KACODE
IFN KLBOOT,<
	SETZB P1,BDATA		;Channel 0 to P1 for BLAST, set up for BLT
	MOVE T1,[BDATA,,BDATA+1] ;Prepare to clear data area
	BLT T1,BDATA+NDATA-1	;Initialize data area to zero
>;IFN KLBOOT
	MOVE P,[-LPDL,,PDL-1]
	PUSHJ P,BLAST		;RESET THE CHANNEL or read the home blocks
IFN DSKDBG,<
	SKIPE N,SYSLOC
	JRST BOOT1
>;IFN DSKDBG
IFN RHDSK,<
	SKIPN N,DIORG		;get location of the MFD
	 JRST NOMFD		;none
>;IFN RHDSK
IFE RHDSK,<
	MOVEI N,MFDLOC
>;IFE RHDSK
	MOVE A,[SIXBIT / SSSYS/]
	PUSHJ P,SRCH		;LOOK FOR _SSSYS.UFD IN MFD
	 JRST NOSYS
	MOVE N,3(TT)		;GET ADDRESS
IFN DSKDBG,<
	MOVEM N,SYSLOC
>;IFN DSKDBG
BOOT1:	MOVE A,[SIXBIT /DSKDMP/]
IFE EXTNEW,<	MOVSI B,'DMP'	>
IFE EXTNEW-1,<	MOVSI B,'NEW'	>
IFE EXTNEW-2,<	MOVSI B,'OLD'	>
IFE EXTNEW-3,<	MOVSI B,'TST'	>
	PUSHJ P,SRCH1			;LOOK FOR DSKDMP.DMP[SS,SYS]
	 JRST NODSKD
	MOVE N,3(TT)			;GET DISK ADDRESS OF DSKDMP.DMP[SS,SYS]
	MOVE T,[-<RTLSIZ+200>,,XBUF]
	SETZM RECORD
	PUSHJ P,READ0			;READ RETRIEVAL AND ONE RECORD
	MOVE A,XBUF+RTLSIZ+140-74	;GET LOC 140 OF THE DUMP FILE
	MOVE B,XBUF+DDLNG		;GET LENGTH OF DUMP FILE
IFN DSKDBG,<
	MOVE C,XBUF+RTLSIZ+JOBSYM↑-74	;GET POINTER TO SYMBOL TABLE
	ADDI C,-274(A)			;RELOCATE IT
	MOVEM C,SYMPNT
>;IFN DSKDBG
	MOVE C,XBUF+RTLSIZ+JOBSA↑-74	;GET STARTING ADDRESS
	HRRZM C,STARTA
	SUBI B,200
	MOVEM B,LODCNT		;LENGTH OF REMAINDER OF DUMP FILE
	MOVEM A,LODNXT		;STORE ADDRESS TO LOAD INTO
	MOVEI B,2
	MOVEM B,RECORD		;START AT RECORD 2
	MOVE C,[DPTRBP+XBUF]	;set up byte ptr to retr ptrs
	MOVEM C,NXTTRK
	MOVE T,LODCNT
	CAILE T,DATSIZ-200
	MOVEI T,DATSIZ-200
	JRST BOOTL2

BOOTL1:	MOVE T,LODCNT
	MOVEI N,1
	MOVEM N,RECORD
BOOTL2:	ILDB N,NXTTRK
	CAILE T,DATSIZ
	MOVEI T,DATSIZ
	MOVEM T,XFRCNT		;SAVE NUMBER OF WORDS THIS TRANSFER
	MOVN T,T		;-NUMBER OF WORDS TO TRANSFER
	HRLZ T,T
	HRR T,LODNXT		;RH GETS NEXT LOC TO LOAD INTO
	PUSHJ P,READ0		;READ REST OF THIS TRACK
	MOVE A,XFRCNT
	ADDM A,LODNXT
	MOVN A,A
	ADDB A,LODCNT
IFN DSKDBG,<
	JUMPLE A,BOOTL3		;ALL DONE
>;IFN DSKDBG
IFE DSKDBG,<
	JUMPLE A,@STARTA	;DONE, TRANSFER TO DSKDMP
>;IFE DSKDBG
	MOVE A,NXTTRK
	CAME A,[DPTEBP+XBUF]	;JUST DID LAST TRACK IN GROUP?
	JRST BOOTL1		;NO, DO NEXT TRACK
	MOVE N,XBUF+DNXTGP	;FIRST TRACK OF NEXT GROUP
	PUSHJ P,RDRET		;READ RETRIEVAL
	MOVE A,[DPTRBP+XBUF]	;set up byte ptr to retr ptrs
	MOVEM A,NXTTRK
	JRST BOOTL1

IFN DSKDBG,<
BOOTL3:	SETOM 37
	MOVE A,SYMPNT
	MOVEM A,36
	JRST @STARTA		;JUMP TO STARTING ADDRESS
>;IFN DSKDBG

NODSKD:
IFE KLBOOT,<
IFE EXTNEW,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.DMP[SS,SYS]/]] >
IFE EXTNEW-1,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.NEW[SS,SYS]/]] >
IFE EXTNEW-2,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.OLD[SS,SYS]/]] >
IFE EXTNEW-3,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.TST[SS,SYS]/]] >
>;IFE KLBOOT
IFN KLBOOT,<
IFE EXTNEW,<	SKIPA B,[[ASCIZ /DMP?/]] >
IFE EXTNEW-1,<	SKIPA B,[[ASCIZ /NEW?/]] >
IFE EXTNEW-2,<	SKIPA B,[[ASCIZ /OLD?/]] >
IFE EXTNEW-3,<	SKIPA B,[[ASCIZ /TST?/]] >
>;IFN KLBOOT
NOSYS:
IFE KLBOOT,<
	MOVEI B,[ASCIZ /CAN'T FIND SSSYS.UFD[1,1]/]
>;IFE KLBOOT
IFN KLBOOT,<
	MOVEI B,[ASCIZ /SS,SYS? /]
>;IFN KLBOOT
	PUSHJ P,TYPE
	JRST 4,.

IFN RHDSK,<
;Here if FDSK (called as BLAST) failed to find right disk structure.
;Original error message has already been typed out.
NOMFD:
IFE KLBOOT,<
	MOVEI B,[ASCIZ/
Type RN to try again, looking for any structure.
/]
	PUSHJ P,TYPE
>;IFE KLBOOT
	JRST 4,.+1
	SETZM FDEV		;set to accept any structure this time
	JRST BOOT
>;IFN RHDSK

>;IFE DSKDSW
;⊗ LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF

;DSKDMP BEGINS HERE

IFN DSKDSW,<
LOWEST←←.
DSKDMP:	JFCL FDZBEG		;start with pointer to data area
	MOVE P,[-LPDL,,PDL-1]
	CONO APR,200000
	CONO PI,10000
IFN KACODE,<
	SKPKL
	JRST DSKDM1
>;IFN KACODE
	CONSZ APR,SWEEPB	;WAIT FOR SWEEP BUSY TO FALL
	JRST .-1
	CONSO KLPAG,600000	;IS THE CACHE ON ALREADY?
	JRST DSKDM0		;NO.
	BLKO CCA,		;VALIDATE CORE
	CONSZ APR,SWEEPB
	JRST .-1
DSKDM0:
IFN RHDSK,<
	SETZM KLEPT		;clear the channel logout areas
	MOVE A,[KLEPT,,KLEPT+1]
	BLT A,KLEPT+MAXCHN*WDPCHN-1 ;clear all channels' logout areas
>;IFN RHDSK
	CONO KLPAG,KLEPT⊗-9	;TURN OFF CACHE.  set EPT address.  TURN OFF MAP
	DATAI CCA,0		;SWEEP CACHE.  INVALIDATE ALL.
	CONSZ APR,SWEEPB	;WAIT FOR SWEEP BUSY TO FALL
	JRST .-1

IFN KACODE,<
	BLKI APR,A		;GET UCODE OPTIONS INTO BITS 0-8 OF A
	TLNN A,100000		;SKIP IF KA SIMULATION UCODE LOADED
	JRST DSKDM1
	SETOM KASIM
	CONO KLPAG,KLEPT⊗-9	;MAKE SURE EPT IS AT right place
	MOVEI C,411
	PUSHJ P,DTEXX		;TELL KLDCP TO ENTER KASIM MODE
IFN RHDSK,<
PRINTX This can't possibly work, since EPT isn't where RH routines expect it
;and if EPT is at page 1000, we can't address it with straight-thru map.
>;IFN RHDSK
	CONO KLPAG,1000		;MOVE EPT TO PAGE 1000
	PUSHJ P,BLAST		;init the C1 channel or read the RH home blocks
	JRST DSKDM2

>;IFN KACODE
DSKDM1:	PUSHJ P,BLAST		;init the C1 channel or read the RH home blocks
	SETZM KASIM
IFN KACODE,<
	SKPKL
	CONO TTY,3600		;CLEAR ALL BUSY AND DONE FLAGS
	SKIPN KASIM
>;IFN KACODE
	SKIPA B,[SIXBIT /  SSYS/]
DSKDM2:	MOVE B,[SIXBIT /  DSYS/];DIAGNOSTICS LIVE HERE
	MOVEM B,DEFPPN
	MOVEI F,0
	MOVEI B,[ASCIZ /
DSKDMP/]
	PUSHJ P,TYPE
IFN KACODE,<
	SKIPN KASIM
	JRST DSKDL
	MOVEI B,[ASCIZ /
KA SIMULATION MICROCODE LOADED
SWITCHES = /]
	PUSHJ P,TYPE
	DATAI APR,B
	PUSHJ P,OCTTYP
>;IFN KACODE
DSKDL:	MOVEI B,[ASCIZ /
*/]
	PUSHJ P,TYPE
	TRZ F,RBO
	MOVEI B,0
DSKDL2:	MOVE A,[010700,,TIBUF-1]
	SETZM TIBUF
	MOVE C,[TIBUF,,TIBUF+1]
	BLT C,TIBUF+TIBFLN-1
DSKDL1:	PUSHJ P,TYI			;GET CHARACTER IN C
	CAIN C,177
	JRST DSKDRO			;RUBOUT
	TRZE F,RBO
	JRST [	PUSH P,C
		MOVEI C,"\"
		PUSHJ P,TYO
		POP P,C
		PUSHJ P,TYO
		CAIE C,15
		JRST .+1
		MOVEI C,12
		PUSHJ P,TYO
		MOVEI C,15
		JRST .+1  ]
	CAIN C,15
	JRST DSKDGO
	CAIN C,33
	JRST DSKDAL			;ALT MODE
	CAIN C,"U"-100
	JRST DSKDL
	IDPB C,A
	JRST DSKDL1

DSKDRO:	CAMN A,[010700,,TIBUF-1]
	JRST DSKDL
	MOVEI C,"\"
	TRON F,RBO			;SET RUBOUT FLAG, SKIP IF ALREADY ON
	PUSHJ P,TYO
	LDB C,A
	PUSHJ P,TYO
	MOVEI C,0
	DPB C,A
	ADD A,[070000,,]
	JUMPGE A,DSKDL1
	SUB A,[430000,,1]
	JRST DSKDL1

DSKDAL:	LDB A,[POINT 7,TIBUF,6]		;GET FIRST CHARACTER
	CAIL A,"0"
	CAILE A,"9"
	CAIA
	JRST SSTRTA			;SET STARTING ADDRESS
	MOVE A,TIBUF
	MOVSI B,-NCMDS
DSKAL1:	CAME A,CMDS(B)
	AOBJN B,DSKAL1
	JUMPL B,DSKDL2			;JUMP IF FOUND ONE (B REMEMBERS THE COMMAND)
	PUSHJ P,QQQ
	JRST DSKDL

QQQ:	MOVEI B,[ASCIZ /  ???/]
	JRST TYPE

DSKDGO:	JUMPE B,LOADGO			;JUST FILE NAME
	JRST @CMDDSP(B)			;DISPATCH ON COMMAND

CMDS:	ASCII /L/			;LOAD
	ASCII /F/			;LIST FILES
	ASCII /D/			;DUMP
	ASCII /K/			;KILL A FILE
	ASCII /G/			;START AT STARTING ADDRESS
	ASCII /M/			;MERGE (LOAD WITHOUT CLEAR)
	ASCII /N/			;LIKE L BUT DOESN'T HACK LOW CORE CELLS
NCMDS←←.-CMDS

CMDDSP:	LOAD
	FILES
	DUMP
	KILL
	START
	MERGE
	NOMUCK

SSTRTA:	MOVE A,[POINT 7,TIBUF]
	MOVEI B,0
SSTRT1:	ILDB C,A
	CAIL C,"0"
	CAILE C,"9"
	JRST SSTRT2
	LSH B,3
	ADDI B,-"0"(C)
	JRST SSTRT1

SSTRT2:	MOVEM B,STARTA
	JRST DSKDL

START:	PUSHJ P,TWAIT			;WAIT FOR TTY TO FINISH
	SKIPE STARTA
	JRST @STARTA
	MOVEI B,[ASCIZ /NO STARTING ADDRESS/]
	PUSHJ P,TYPE
	JRST DSKDL

LOADGO:	SETOM ZERFLG
	SETOM MUCKFL
	PUSHJ P,LOADIT
	 JRST DSKDL			;COULDN'T DO IT
	MOVEI B,[ASCIZ / LOADED/]
	PUSHJ P,TYPE
	PUSHJ P,TWAIT
	SKIPE STARTA
	JRST @STARTA			;START IT UP
	MOVEI B,[ASCIZ / BUT NO STARTING ADDRESS/]
	PUSHJ P,TYPE
	JRST DSKDL

NOMUCK:	SETOM ZERFLG
	SETZM MUCKFL
	JRST LOADN

MERGE:	SETZM ZERFLG
	SETOM MUCKFL
	JRST LOADN

LOAD:	SETOM ZERFLG
	SETOM MUCKFL
LOADN:	PUSHJ P,LOADIT
	 JRST DSKDL			;COULDN'T DO IT
	MOVEI B,[ASCIZ / LOADED/]
	PUSHJ P,TYPE
	JRST DSKDL

;SKIP RETURNS IF SUCCESSFUL
LOADIT:	PUSHJ P,FILSET			;SET UP FILE NAME
	SKIPN FNAM
	JRST QQQ
IFN RHDSK,<
	MOVE A,FDEV		;see what structure is requested
	CAMN A,STRNAM		;skip if diff structure seen, need to scan disk
	SKIPN DIORG		;skip if already have info for this structure
	PUSHJ P,FDSK		;find desired structure on the disk
	SKIPN N,DIORG		;get location of the MFD
	 JRST QQQ		;didn't find MFD, msg already typed, type ???
>;IFN RHDSK
IFE RHDSK,<
	MOVEI N,MFDLOC
>;IFE RHDSK
	MOVE A,FPPN
	MOVEM A,DEFPPN
	PUSHJ P,SRCH
	 JRST NSA			;UFD NOT FOUND IN MFD
	MOVE N,3(TT)			;DISK ADDRESS OF UFD
	MOVE A,FNAM
	HLLZ B,FEXT
	PUSHJ P,SRCH1
	 JRST FNF			;FILE NOT FOUND IN UFD
	MOVE N,3(TT)			;DISK ADDRESS OF FILE
	SKIPN ZERFLG
	JRST LDIT0
	SETZM 40
	MOVE A,[40,,41]
IFE RHDSK,<
	BLT A,DSKDMP-1			;CLEAR CORE UP TO DSKDMP
>;IFE RHDSK
IFN RHDSK,<
	BLT A,KLEPT-1			;CLEAR CORE UP TO DSKDMP, preserve EPT
>;IFN RHDSK
LDIT0:	MOVE T,[-<RTLSIZ+200>,,XBUF]
	SETZM RECORD
	PUSHJ P,READ0			;READ RETRIEVAL AND ONE RECORD
	SETZB C,FHILOC
	SETZM STARTA
	SKIPN MUCKFL			;SKIP IF MUCKING WITH LOW CORE CELLS
	JRST LDIT0A
	MOVE C,XBUF+RTLSIZ+JOBSYM↑-74	;GET POINTER TO SYMBOL TABLE
	MOVEM C,SYMPNT			;SAVE FOR LATER
	MOVE C,XBUF+RTLSIZ+JOBSA↑-74	;GET STARTING ADDRESS
	HRRZM C,STARTA
	MOVE C,XBUF+RTLSIZ+HILOC↑-74	;ADDRESS OF BEGINNING OF UPPER
	MOVEM C,FHILOC
LDIT0A:	MOVE B,XBUF+DDLNG		;GET LENGTH OF DUMP FILE
	JUMPE C,LDIT1			;NO UPPER
	MOVEI B,-74(C)			;FILE SIZE OF LOWER
	SUBI C,1
	IORI C,1777			;LAST ADDRESS OF LOWER
	CAIGE C,377777
	MOVEI C,377777
	ADDI C,1
	MOVEM C,UPPRST			;UPPER STARTS HERE
LDIT1:	MOVEM B,LODCNT
	MOVEI A,74
	MOVEM A,LODNXT			;STORE ADDRESS TO LOAD INTO
	PUSHJ P,LDLP			;LOAD THE LOWER
	SKIPN C,FHILOC			;SKIP IF THERE IS AN UPPER
	JRST LDIT2			;NO UPPER
	MOVE B,XBUF+DDLNG
	SUBI B,-74(C)			;COMPUTE SIZE OF UPPER
	MOVEM B,LODCNT
	MOVE B,UPPRST
	MOVEM B,LODNXT			;STARTING CORE ADDRESS OF UPPER
	MOVE A,RECORD			;NEXT RECORD TO READ IS FIRST REC OF UPPER
	CAIN A,DATRPB+1
	JRST LDIT3			;UPPER BEGINS ON A TRACK BOUNDARY
	MOVN T,A
	ADDI T,DATRPB+1			;NUMBER OF RECORDS LEFT IN TRACK
	IMULI T,200			;NUMBER OF WORDS LEFT IN TRACK
	CAMLE T,LODCNT
	MOVE T,LODCNT
	LDB N,NXTTRK
	PUSHJ P,LDLP3
	JRST LDIT2

LDIT3:	MOVE A,NXTTRK
	CAME A,[DPTEBP+XBUF]	;JUST DID LAST TRACK IN GROUP?
	JRST LDIT4
	MOVE N,XBUF+DNXTGP
	PUSHJ P,RDRET			;READ RETRIEVAL OF NEXT GROUP
	MOVE A,[DPTRBP+XBUF]		;set up byte ptr to retr ptrs
	MOVEM A,NXTTRK
LDIT4:	PUSHJ P,LDLP1			;LOAD THE UPPER
LDIT2:	MOVEI A,-1
	MOVEM A,37
	MOVE A,SYMPNT
IFN KACODE,<
	SKIPE KASIM
	MOVEI A,116			;PDP-6 DDT EXPECTS 36 TO POINT TO SYM PTR
>;IFN KACODE
	MOVEM A,36
	JRST CPOPJ1

;SET LODNXT TO FIRST LOCATION TO LOAD INTO, LODCNT TO NUMBER OF WORDS TO TRANSFER
;STARTS READING AT THE BEGINNING OF THE GROUP WHOSE RETRIEVAL IS IN XBUF
LDLP:	MOVE C,[DPTRBP+XBUF]		;set up byte ptr to retr ptrs
	MOVEM C,NXTTRK
LDLP1:	MOVE T,LODCNT
	MOVEI N,1
	MOVEM N,RECORD
	ILDB N,NXTTRK
LDLP3:	CAILE T,DATSIZ
	MOVEI T,DATSIZ
	MOVEM T,XFRCNT			;SAVE NUMBER OF WORDS THIS TRANSFER
	MOVN T,T			;-NUMBER OF WORDS TO TRANSFER
	HRLZ T,T
	HRR T,LODNXT			;RH GETS NEXT LOC TO LOAD INTO
	PUSHJ P,READ0			;READ THE TRACK
	MOVE A,XFRCNT
	ADDM A,LODNXT
	MOVN A,A
	ADDB A,LODCNT
	JUMPLE A,CPOPJ			;DONE
	MOVE A,NXTTRK
	CAME A,[DPTEBP+XBUF]	;JUST DID LAST TRACK IN GROUP?
	JRST LDLP1			;NO, DO NEXT TRACK
	MOVE N,XBUF+DNXTGP		;FIRST TRACK OF NEXT GROUP
	PUSHJ P,RDRET			;READ RETRIEVAL
	JRST LDLP

FILES:	MOVEI B,[ASCIZ /FILES COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

DUMP:	MOVEI B,[ASCIZ /DUMP COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

KILL:	MOVEI B,[ASCIZ /KILL COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

NSA:	MOVEI B,[ASCIZ /NO SUCH AREA - /]
	PUSHJ P,TYPE
	JRST PPNTYP

FNF:	MOVEI B,[ASCIZ /NO SUCH FILE - /]
	PUSHJ P,TYPE
	JRST FILTYP
;⊗ FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1

;SCAN TIBUF AND SET UP FILE NAME, EXTENSION AND PPN
FILSET:
IFN RHDSK,<
	MOVE B,DEFDEV		;set up default structure name (device)
	MOVEM B,FDEV
>;IFN RHDSK
	MOVE B,DEFPPN
	MOVEM B,FPPN
	MOVE B,DEFEXT
	MOVEM B,FEXT
	SETZM FNAM
	SETZM FEXT+1
	MOVE A,[010700,,TIBUF-1]
	PUSHJ P,FILSIX
IFN RHDSK,<
	CAIE D,":"		;device given?
	JRST FILSE0		;no, must be filename
	MOVEM B,FDEV		;yes, store device name
	PUSHJ P,FILSIX		;now read filename
FILSE0:
>;IFN RHDSK
	MOVEM B,FNAM
	CAIE D,"."
	JRST FILSE1
	PUSHJ P,FILSIX
	HLLZM B,FEXT
FILSE1:	CAIE D,"["
	POPJ P,
	PUSHJ P,FILSIX
	PUSHJ P,RADJ
	HLLM B,FPPN
	CAIE D,","
	POPJ P,
	PUSHJ P,FILSIX
	PUSHJ P,RADJ
	HLRM B,FPPN
	POPJ P,

FILSIX:	MOVEI B,0
	MOVE C,[440600,,B]
FILSI1:	ILDB D,A		;GET NEXT CHARACTER FROM BUFFER
	CAIE D,"."
	CAIN D,"["
	POPJ P,
	CAIE D,","
	CAIN D,"]"
	POPJ P,
IFN RHDSK,<
	CAIN D,":"		;see structure name?
	POPJ P,			;yes
>;IFN RHDSK
	JUMPE D,CPOPJ
	SUBI D,40
	TLNE C,770000
	IDPB D,C
	JRST FILSI1

RADJ:	JUMPE B,CPOPJ
RADJ1:	TLNE B,77
	POPJ P,
	LSH B,-6
	JRST RADJ1
>;IFN DSKDSW
;⊗ SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1

;SRCH IS GIVEN A FILENAME IN A AND A block IN N.
;SRCH1 IS GIVEN A FILENAME IN A, AN EXTENSION IN B AND A block IN N
SRCH:	MOVSI B,'UFD'
SRCH1:	PUSHJ P,READ		;READ block N INTO XBUF
	SKIPN T,DDLNG+XBUF	;GET FILE LENGTH
	POPJ P,
	MOVE TT,[DPTRBP+XBUF]	;set up byte ptr to get retr ptrs
	IBP TT			;prepare to get second retr ptr (skip first)
	MOVEM TT,NXTTRK
SRCH2:	MOVE TT,[-DATSIZ,,XBUF+RTLSIZ] ;scan block starting beyond retrieval
SRCH3:	HLLZ C,1(TT)		;get file extension
	CAMN A,(TT)
	CAME B,C
	JRST SRCHLP		;not the file we want
	JRST CPOPJ1		;RETURN WITH POINTER IN TT

SRCHLP:	SUBI T,NUFDWD		;one less UFD entry left
	JUMPLE T,CPOPJ		;jump if no more data in UFD, file not found
	ADD TT,[NUFDWD-1,,NUFDWD-1] ;advance to next UFD entry
	AOBJN TT,SRCH3		;jump if more UFD entries
	MOVE TT,NXTTRK		;get byte ptr to next block
	CAMN TT,[DPTEBP+XBUF]	;JUST DID LAST block IN GROUP?
	JRST SRCH4		;YES, get next group
	ILDB N,NXTTRK		;no, get next block within group
SRCH5:	PUSH P,T		;SAVE COUNT OF WORDS LEFT TO SEARCH
	PUSHJ P,READ		;READ IN THE NEXT block
	POP P,T
	JRST SRCH2		;go search the new block

SRCH4:	MOVE N,DNXTGP+XBUF	;NUMBER OF FIRST block of NEXT GROUP
	MOVE TT,[DPTRBP+XBUF]	;set up byte ptr to get retr ptrs
	IBP TT			;prepare to get second retr ptr (skip first)
	MOVEM TT,NXTTRK
	JRST SRCH5

;RDRET READS RETRIEVAL OF block WHOSE ADDRESS IS IN N
;READ READS ENTIRE block WHOSE ADDRESS IS IN N
RDRET:	SKIPA T,[-RTLSIZ,,XBUF]	;read retrieval only into this buffer
READ:	MOVE T,[-BLKSIZ,,XBUF]	;read whole block into this buffer
	SETZM RECORD		;START READING AT RECORD ZERO within block
READ0:
IFN RHDSK,<
	MOVEI TT,(T)		;memory address of transfer
	DPB TT,[POINT 22,ICCW,35] ;store physical address (same as virtual addr)
	HLRE TT,T		;get negative word count
	MOVN TT,TT		;positive word count
	CAILE TT,3777		;max word count for one CCW
	JRST 4,.		;word count wouldn't have fit in CCW
	DPB TT,[POINT 11,ICCW,13] ;store word count for channel
	MOVE T,N		;get record number of transfer
	ADD T,RECORD		;add in record offset within WAITS block
	IDIV T,HOMSIZ		;record number within unit to TT, logical unit to T
	CAMLE T,MAXUNI		;make sure valid unit number
	JRST 4,.		;unit number out of range
	LDB P1,[POINT 17,DSKTAB(T),17] ;get physical channel number for log. unit
	HRRZ P2,DSKTAB(T)	;get physical drive number of logical unit
	MOVE T,TT		;record nbr within unit
	IDIV T,NUMSCL		;rec nbr within cyl to TT, cyl to T
	PUSH P,T		;save cyl
	MOVE T,TT		;rec nbr within cyl
	IDIV T,NUMSTK		;sector within track to TT, track to T
	MOVE P4,TT		;sector in low bits
	LSH T,=35-=27		;move track (head) number to end in bit 27
	IOR P4,T		;combine head and sector
	IOR P4,[.RHSBR!LR]	;For RH20 SBAR
	POP P,T1		;get back cyl
	JRST RDDISK		;tell the channel to do the transfer
>;IFN RHDSK
IFE RHDSK,<
READC1:	PUSHJ P,C1MPIL			;HERE WITH WCMA IN T, COMPILE INTO MRT INST
	PUSH P,T			;SAVE RECORD NUMBER RETURNED BY C1MPIL
	SETZM C1ERR			;CLEAR ERROR COUNT
	PUSH P,N+1		;save AC N+1
	IDIVI N,TRKPK			;N←PACK, N+1←TRACK ON PACK
	EXCH N+1,(P)		;restore N+1, save track on pack
	POP P,T			;T←track on pack
	IDIVI T,TRKCYL			;T←CYLINDER, TT←HEAD
	DPB T,[POINT 16,C1CCHR,15]	;C C
	DPB TT,[POINT 8,C1CCHR,23]	;H
	MOVE TT,RECORD
	POP P,RECORD
	DPB TT,[POINT 8,C1CCHR,31]	;R
	MOVE TT,C1WCHN(N)		;GET CHANNEL NUMBER
	DPB N,[POINT 4,@C1PPTP(TT),12]	;STORE DISK DRIVE ADDRESS
	MOVEI N,4
	DPB N,[POINT 5,@C1PPTP(TT),4]	;STORE START CODE
C1WAIT:	JUMPN TT,C1WAIB
	CONSO C1A,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1APT+C1ISW
C1WAIA:	TLC T,200000
	TLNE T,600000
	JRST C1WERR
	MOVE T,C1PH+C1STA		;STATUS A WORD
	TRNN T,C1HLT
	JRST C1WERR
	XCT C1CIFI(TT)			;CLEAR INT FLAG
	POPJ P,

C1WAIB:	CONSO C1B,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1BPT+C1ISW
	JRST C1WAIA

C1WERR:	AOS T,C1ERR
	CAIL T,=10
	JRST C1DIE
	PUSHJ P,BLAST			;re-initialize the C1 channel
	MOVEI T,4
	DPB T,[POINT 5,@C1PPTP(TT),4]		;START C1 AGAIN
	JRST C1WAIT

C1DIE:	MOVEI B,[ASCIZ /C1 ERRORS
/]
	PUSHJ P,TYPE
	JRST 4,.


C1MPIL:	PUSH P,A			;HERE WITH WCMA IN T, 1ST RECORD # IN RECORD
	PUSH P,B
	PUSH P,C
	MOVE A,[-=21,,C1MRTD-1]		;PUSH DOWN POINTER FOR DATA POINTERS
	MOVE B,RECORD
C1MPI1:	HRLZ C,RCLTAB(B)		;GET SIZE OF RECORD
	LSH C,4
	HRR C,T
	TLO C,600000			;MARK AS DATA PNTR AND 1ST OF THE RECORD
	PUSH A,C
	ADD T,RCLTAB(B)
	ADDI B,1			;ADVANCE RECORD NUMBER
	JUMPL T,C1MPI1
	MOVE T,B			;RETURN NEXT RECORD NUMBER IN T
	PUSH A,[0]
	POP P,C
	POP P,B
	POP P,A
	POPJ P,

C1SET:	SETZM C1ZERO
	MOVE A,[C1ZERO,,C1ZERO+1]
	BLT A,C1ZEND-1
	MOVEI A,253
	MOVEM A,C1APT+C1CCW
	MOVEM A,C1BPT+C1CCW
	MOVEI A,C1BW				;BUSY WAIT BIT
	MOVEM A,C1PH
	MOVE A,[C1JMP,,C1MRTC]
	MOVEM A,C1PH+C1INST
	MOVE A,[<BYTE (5)37 (8)CUADR⊗4>!C1PH]
	MOVEM A,C1APT+C1PPTR
	MOVE A,[<BYTE (5)37 (8)<CUADR+1>⊗4>!C1PH]
	MOVEM A,C1BPT+C1PPTR
	POPJ P,

;See FDSK for the IFN RHDSK version of BLAST; this is the IFE RHDSK version.
BLAST:
;RESET C1 CHANNELS
RSTC1:	AOSN C1FRST
	PUSHJ P,C1SET				;SET UP C1 DATA AREAS ONCE ONLY
	CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT	;RESET ALL CHANNELS START CLOCK
	CONO C1A,C1SCH!C1RST!C1MPCN		;RESET CHAN A AND START UP
	CONO C1B,C1SCH!C1RST!C1MPCN		;RESET CHAN B AND START UP
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1A TO DO A SYSTEM RESET
	MOVEI A,100000
	CONSZ C1A,CF1				;WAIT FOR IT TO DROP CF1
	SOJG A,.-1
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1B TOO
	MOVEI A,100000
	CONSZ C1B,CF1
	SOJG A,.-1
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT	;INT THE CHANNEL FOR LD ...
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT	;...PGM TABLE.
	MOVEI A,100000
	CONSO C1A,CF2			;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
	SOJG A,.-1
	DATAO C1A,C1PTP			;TELL IT WHERE THE PROGRAM TABLE IS
	CONO C1A,C1SCH!C1CCF1		;CLEAR CF1 (TELL IT WE'VE TOLD IT)
	MOVEI A,100000
	CONSZ C1A,CF2			;WAIT FOR CHANNEL TO DROP CF2
	SOJG A,.-1
	MOVEI A,100000
	CONSO C1B,CF2			;REPEAT FOR SECOND CHANNEL
	SOJG A,.-1
	DATAO C1B,C1PTP+1
	CONO C1B,C1SCH!C1CCF1
	MOVEI A,100000
	CONSZ C1B,CF2
	SOJG A,.-1
	POPJ P,
>;IFE RHDSK
;⊗ TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1

TYPE:	HRLI B,440700
TYPE1:	ILDB C,B
	JUMPE C,CPOPJ
	PUSHJ P,TYO
	JRST TYPE1

TYO:	PUSH P,C
	CAIN C,33
	MOVEI C,"$"
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
>;IFN KACODE
	JRST KLTYO
IFN KACODE,<
	CONSZ TTY,20
	JRST .-1
	DATAO TTY,C
	POP P,C
	POPJ P,
>;IFN KACODE

CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,


DTEXX:	MOVEM C,KLEPT+DTCMD
	SETZM KLEPT+DTFLG		;CLEAR 11'S RESPONSE FLAG
	CONO DTE0,DONG11		;RING FOR 11
	SKIPN KLEPT+DTFLG		;WAIT FOR RESPONSE
	JRST .-1
	MOVE C,KLEPT+DTF11		;GET 11'S RESPONSE WORD
	POPJ P,

KLTYO:	ANDI C,177
	PUSHJ P,DTEXX
	POP P,C
	POPJ P,

IFN DSKDSW,<

KLTYI:	MOVEI C,3400
	PUSHJ P,DTEXX
	JUMPE C,KLTYI
	JRST KLTYI1

TYI:
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
>;IFN KACODE
	JRST KLTYI
IFN KACODE,<
	CONSO TTY,40
	JRST .-1
	DATAI TTY,C
>;IFN KACODE
KLTYI1:	ANDI C,177			;FLUSH PARITY BIT
	CAIL C,"a"
	CAILE C,"z"
	CAIA
	SUBI C,40
	CAIE C,176
	CAIN C,175
	MOVEI C,33
	CAIN C,12
	MOVEI C,15
	CAIN C,"U"-100
	JRST TYICAN
	TRNE F,RBO			;SKIP UNLESS RUBBING OUT
	POPJ P,				;DON'T ECHO HERE IF RUBBING OUT
	PUSH P,C
	PUSHJ P,TYO
	CAIE C,15
	JRST POPCJ
	MOVEI C,12
	PUSHJ P,TYO
POPCJ:	POP P,C
	POPJ P,

TYICAN:	MOVEI C,"↑"
	PUSHJ P,TYO
	MOVEI C,"U"
	PUSHJ P,TYO
	MOVEI C,"U"-100
	TRZ F,RBO
	POPJ P,

FILTYP:
IFN RHDSK,<
	MOVE D,FDEV
	PUSHJ P,TYPSIX
	MOVEI C,":"
	PUSHJ P,TYO
>;IFN RHDSK
	MOVE D,FNAM
	PUSHJ P,TYPSIX
	MOVEI C,"."
	SKIPN D,FEXT
	JRST PPNTYP
	PUSHJ P,TYO
	PUSHJ P,TYPSIX
PPNTYP:	MOVEI C,"["
	PUSHJ P,TYO
	HLLZ D,FPPN
	PUSHJ P,TYPSIX
	MOVEI C,","
	PUSHJ P,TYO
	HRLZ D,FPPN
	PUSHJ P,TYPSIX
	MOVEI C,"]"
	JRST TYO

TYPSIX:	MOVEI C,0
	LSHC C,6
	JUMPE C,TYPSI1
	ADDI C,40
	PUSHJ P,TYO
TYPSI1:	JUMPN D,TYPSIX
	POPJ P,

TWAIT:
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
	POPJ P,
	CONSZ TTY,20
	JRST TWAIT
>;IFN KACODE
	POPJ P,

OCTTYP:	IDIVI B,10
	JUMPE B,OCTTY1
	HRLM C,(P)
	PUSHJ P,OCTTYP
	HLRZ C,(P)
OCTTY1:	ADDI C,"0"
	JRST TYO
>;IFN DSKDSW
;⊗ C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN FDEV

;DISK ADDRESSES AND POINTERS

IFE RHDSK,<
C1ZERO::			;ZERO FROM HERE TO C1ZEND AT DISKUP
C1APT:	BLOCK C1PPTR+1+1	;CHN CTL WD, INT WD, PGM PTR, END MARK
C1BPT:	BLOCK C1PPTR+1+1	;PROGRAM TABLE FOR SECOND CHANNEL
C1PH:	BLOCK C1INST		;PROGRAM HEADER
	0			;JUMP TO PROGRAM

C1ZEND::

C1FRST:	-1			;-1 FIRST TIME THROUGH
C1ERR:	0			;ERROR COUNT

C1PTP:	C1APT			;POINTERS TO PRG TABLES INDEXED BY CHANNEL NUMBER
	C1BPT

C1PPTP:	C1APT+C1PPTR
	C1BPT+C1PPTR

C1CIFI:	CONO C1A,C1SCH!C1CCIF		;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
	CONO C1B,C1SCH!C1CCIF

;WCMAS FOR CONTROL COMMANDS
DEFINE C1WCMA (COUNT,ADDR,REC)<
ZZZ←←0
IFIDN <REC><R><ZZZ←←1>
BYTE (1)1 (1)ZZZ (13)COUNT (22)ADDR
>

C1MRTC:	C1MRT!C1NATM!6,,0		;MRT READ COMMAND
C1CCHR:	BYTE (8)0,0,0,0			;C C H R
	BYTE (8)0,DATRPB+1-1,0,0	;SECTOR, LAST REC, WRAP REC, 0
	C1JMP,,C1MRTD			;JUMP TO 1ST DATA POINTER
C1MRTD:	BLOCK DATRPB+1
	0

	'C1WCHN'	;FOR AIDING LOCATING OF THIS TABLE IN CORE FROM DDT
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFN FT1DSK,<
	1
	1
	1
	1
	1
	1
	1
	1
>;IFN FT1DSK
IFE FT1DSK,<
	0
	1
	0
	1
	0
	1
	0
	1
>;IFE FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>


RCLTAB:	RTLSIZ,,RTLSIZ
REPEAT DATRPB,<
	200,,200
>
>;IFE RHDSK

IFN DSKDSW,<
XBUF:	BLOCK BLKSIZ
>;IFN DSKDSW

LPDL←←20

IFE KLBOOT,<
PDL:	BLOCK LPDL

ERRCNT:	0
RECORD:	0
NXTTRK:	0			;BYTE POINTER TO DPTR

SYMPNT:	0			;SYMBOL TABLE POINTER FROM DSKDMP.DMP

IFN DSKDBG,<
SYSLOC:	0			;DISK ADDRESS OF SSSYS.UFD[1,1]
>;IFN DSKDBG
IFN DSKDSW,<
PATCH:	BLOCK 40
PATCH1:	BLOCK 40
>;IFN DSKDSW

LODCNT:	0			;NUMBER OF WORDS IN FILE LEFT TO LOAD
LODNXT:	0			;NEXT ADDRESS TO LOAD INTO
XFRCNT:	0			;NUMBER OF WORDS THIS TRANSFER
STARTA:	0			;DSKDMP'S STARTING ADDRESS
KASIM:	0			;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFE KLBOOT

IFN DSKDSW,<
MUCKFL:	0			;-1 IF MUCKING AROUND WITH LOW CORE CELLS
ZERFLG:	0			;-1 TO ZERO CORE FIRST
FHILOC:	0			;HILOC OF FILE WE ARE LOADING
UPPRST:	0			;CORE ADDRESS OF START OF UPPER

TIBFLN←←20
TIBUF:	BLOCK TIBFLN
FNAM:	0
FEXT:	0
	0
FPPN:	0
IFN RHDSK,<
DEFDEV:	SIXBIT /TSK/	;default structure (DSKDMP)
>;IFN RHDSK
DEFEXT:	SIXBIT /DMP/	;DEFAULT EXTENSION
DEFPPN:	SIXBIT /  SSYS/	;DEFAULT PPN
>;IFN DSKDSW

IFN RHDSK,<
FDEV:	SIXBIT /TSK/	;default (and only) structure for BOOT, stru for DSKDMP
>;IFN RHDSK

IFN KLBOOT,<
DATAWD(PDL,LPDL)
DATAWD(ERRCNT,1)
DATAWD(RECORD,1)
DATAWD(NXTTRK,1)		;BYTE POINTER TO DPTR
DATAWD(SYMPNT,1)		;SYMBOL TABLE POINTER FROM DSKDMP.DMP

DATAWD(LODCNT,1)		;NUMBER OF WORDS IN FILE LEFT TO LOAD
DATAWD(LODNXT,1)		;NEXT ADDRESS TO LOAD INTO
DATAWD(XFRCNT,1)		;NUMBER OF WORDS THIS TRANSFER
DATAWD(STARTA,1)		;DSKDMP'S STARTING ADDRESS
DATAWD(KASIM,1)			;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFN KLBOOT
;⊗ FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY1 .R7TY2 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG

IFN RHDSK,<

OPDEF CALL [PUSHJ P,]
OPDEF RET [POPJ P,]

;General assumptions
; Register use:
;	P1	Holds the physical channel number 0 ≤ channel < MAXCHN (8)
;	P2	Holds the physical unit number  0 ≤ unit < MAXDRV (8)
		;(>> matching brackets)

IFE KLBOOT,<
;Data storage
FDZBEG←←.	;start of area initialized to zero by FDSK
DIORG:	0	;Set up by FDSK with the location of the MFD, from HOMXRB
ICCW:	0	;Set to a Channel Command Word for transfer
	0	;halt CCW
RH2CYL:	0	;desired cylinder
MAXUNI:	0	;Maximum unit number of the structure that was found.
		;(This is one less than the number of units in structure.)
DSKTYP:	0	;Initially zero, the Drive Type of the units in this str.
NUMCYL:	0	;Number of cylinders/unit for this drive type
NUMSCL:	0	;Number of sectors/cylinder for this drive type
NUMSTK:	0	;Number of sectors/track for this drive type
STRNAM:	0	;Name of structure represented by DIORG and DSKTAB

RMXDRV←←20		;max number of drives we're prepared to handle
DSKTAB:	BLOCK RMXDRV	;Table we set up with one word per drive, indexed
			;by logical drive number.  Each word will contain:
			;  400000!<physical channel>,,<physical unit>
FDZEND←←.-1	;end of area initialized to zero by FDSK

NDSKOP:	0	;counts all diskops, successful or not
NDSKLZ:	0	;counts losing diskops
>;IFE KLBOOT
IFN KLBOOT,<
;Data storage
;FDZBEG←←.	;start of area initialized to zero by FDSK
DATAWD(DIORG,1)	;Set up by FDSK with the location of the MFD, from HOMXRB
DATAWD(ICCW,2)	;Set to a Channel Command Word for transfer, 2nd word is halt
DATAWD(RH2CYL,1);desired cylinder
DATAWD(MAXUNI,1);Maximum unit number of the structure that was found.
		;(This is one less than the number of units in structure.)
DATAWD(DSKTYP,1);Initially zero, the Drive Type of the units in this str.
DATAWD(NUMCYL,1);Number of cylinders/unit for this drive type
DATAWD(NUMSCL,1);Number of sectors/cylinder for this drive type
DATAWD(NUMSTK,1);Number of sectors/track for this drive type
DATAWD(STRNAM,1);Name of structure represented by DIORG and DSKTAB

RMXDRV←←20		;max number of drives we're prepared to handle
DATAWD(DSKTAB,RMXDRV)	;Table we set up with one word per drive, indexed
			;by logical drive number.  Each word will contain:
			;  400000!<physical channel>,,<physical unit>
;FDZEND←←.-1	;end of area initialized to zero by FDSK

DATAWD(NDSKOP,1);counts all diskops, successful or not
DATAWD(NDSKLZ,1);counts losing diskops
>;IFN KLBOOT

PAGSIZ←←1000	;words per page

;A%FP0 is defined as the page after KLEPT and is a
;one page data buffer.  Home block is read into
;second record of this page.  The following
;definitions of home block words are used:

  ;HOME BLOCK DEFINITIONS

  HOMNAM←←A%FP0+200+0	;SIXBIT /HOM/
  HOMSNM←A%FP0+200+3	;SIXBIT /STRUCTURE NAME/
  HOMLUN←A%FP0+200+4	;XWD TOTAL PACKS, LOGICAL PACK #
  HOMHOM←A%FP0+200+5	;BLOCK # OF OTHER HOME BLK,, BLK # OF THIS HB
  HOMRXB←A%FP0+200+10	;ADR OF INDEX BLOCK OF ROOT DIRECTORY (MFD on WAITS)
  HOMSIZ←A%FP0+200+13	;SIZE OF A UNIT IN SECTORS (records)

  HOMFSN←A%FP0+200+173	;FILE SYSTEM TYPE
  HOMCOD←A%FP0+200+176	;0 ,, CODHOM
  HOMSLF←A%FP0+200+177	;THIS HOME BLOCK #

  CODHOM←←707070  ;the special code to mark home blocks

;Constants
ICA←←0			;Offset from EPT origin to channel 0's Logout area
ENTFLG←←400000		;Flag in left half of DSKTAB table used to
			;distinguish channel 0 unit 0 from a missing entry
MAXCHN←←8		;maximum number of channels
MAXDRV←←8		;maximum number of drives per channel

;Device Definitions
;	RH20
		RH0←←540		;device number
;	RH20 CONO/CONI
		.RHRAE←←1B24		;Clear RAE (In CONI, Register Access Err)
		.RHMBR←←1B25		;Clear RH20 & attached Devices
		.RHCTE←←1B26		;Clear transfer error
		.RHMBE←←1B27		;Enable Massbus Transmitters (also CONI)
		.RHSTP←←1B31		;Stop a hung transfer
		.RHDON←←1B32		;Clear Done (In CONI, Transfer Done)
		RHERR←←775120		;All the RH20 error bits (in CONI)
					;Data Bus Parity; Drive Exception
					;Long WC; Whort WC; Channel Error
					;Drive Response Error; RAE; Overrun
					;and Either Command Buffer Full
;	RH20 DATAO/DATAI
		LR←←1B6			;Load Register Bit

;	RP06 Registers
		R4%CSR←←0B5		;Drive Command Register
;		RP06 Drive Commands
			R4%CRC←←07	;Recalibrate
			R4%RIP←←21	;Read-in Preset
			R4%CPA←←23	;Pack Acknowledge
			R4%CRD←←71	;Read Data
		R4%DSR←←1B5		;Drive Status Register
			.RPERR←←1B21	;Composite error
			.RPMOL←←1B23	;Medium On-Line
			.RPDRY←←1B28	;Drive Ready
		R4%ATN←←4B5		;Attention Summary Register
		R4%DST←←5B5		;Drive Sector & Track
		R4%DTR←←6B5		;Drive Type Register
			R4%TYP←←777	;Mask for drive type bits only
		R4%DC←←12B5		;Cylinder Register
		.RHSBR←←70B5		;RH20 Secondary Block Address Reg
		.RHSTR←←71B5		;RH20 Secondary Transfer Control Reg
			RCLP←←1B7	;Reset Command List Pointer
			STLW←←1B10	;Store Ending Status

R4%TYP←←777B35			;DEVICE TYPE FIELD IN TYPE REGISTER
.R4TYP←←20			;RP04 DEVICE TYPE CODE
.R5TYP←←21			;RP05 DEVICE TYPE CODE
.R6TYP←←22			;RP06 DEVICE TYPE CODE
.R7TY2←←41			;RP07 DEVICE TYPE CODE (moving head?)
.R7TY1←←42			;RP07 DEVICE TYPE CODE (fixed head?) (our kind)
.R3TYP←←24			;RM03 DEVICE TYPE CODE
RHERR←←775120			;RH10 CONI ERROR BITS
NRETRY←←5			;NUMBER OF TIMES TO RETRY
TIMOUT←←=50000			;COUNT FOR SOJG TIMEOUT

repeat 0,<
;R4%CSK←←02B34			;RP04 SEEK FUNCTION
R4%CRC←←03B34			;RE-CALIBRATE FUNCTION IN CONTROL REGISTER
R4%CDC←←04B34			;RP04 DRIVE CLEAR FUNCTION
R4%RIP←←10B34			;READ-IN PRESET FUNCTION
R4%CPA←←11B34			;PACK ACKNOWLEDGE FUNCTION IN CONTROL REGISTER
;R4%CWR←←30B34			;RP04 WRITE FUNCTION
R4%CRD←←34B34			;RP04 READ FUNCTION
>;repeat 0

N.SCL3←←=148			;SECTORS PER CYL (RM03)
N.SCL4←←=380			;SECTORS PER CYL (RP04/RP05/RP06)
N.SCL7←←=1376			;SECTORS PER CYL RP07
N.CLP3←←=820			;CYLS PER UNI (RM03)
N.CLP4←←=400			;CYLS PER UNI (RP04/5)

repeat 0,<
N.CLP6←←=800			;CYLS PER UNI (RP06)
N.CLP7←←=629			;CYLS PER UNI (RP07)
>;repeat 0

N.CLP6←←=815			;CYLS PER UNI (RP06)
N.CLP7←←=630			;CYLS PER UNI (RP07)

N.STK3←←=30			;SECTORS PER TRACK (RM03)
N.STK7←←=43			;SECTORS PER TRACK (RP07)
N.STK4←←=20			;SECTORS PER TRACK (RP04) (and 05/06?)

N.BKPG←←4		;number of records per page
;⊗ BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI

;Routine to locate the physical units for a given structure (FDEV).
;Sets up DSKTAB and DIORG if successful.
;Types error msg if appropriate.

BLAST::
FDSK:
IFE KLBOOT,<
	SETZB P1,FDZBEG		;Channel 0 to P1, set up for BLT
	MOVE T1,[FDZBEG,,FDZBEG+1] ;Prepare to clear data area
	BLT T1,FDZEND		;Initialize data area to zero
>;IFE KLBOOT
	SETOM MAXUNI		;No highest unit in structure
;;	MAP T1,A%FP0		;Convert addr of FP0 to physical
;;	TLZ T1,777760		;Keep the 22 physical addr bits
	MOVEI T1,A%FP0		;set up physical address of buffer (mapping is off)
	TLO T1,(<1B0+1B1+<1000B13>>) ;CCW: Data, Halt, Word Count = 1 page
	MOVEM T1,ICCW		;Store first data CCW
;Examine the channel whose number is in P1
FDSK1:	MOVEI T1,.RHMBR		;RH20 Reset function
	CALL RHCONO		;Reset the RH20
	MOVEI T1,.RHMBE		;RH20 Enable function
	CALL RHCONO		;Enable Massbus transmitters
	CALL RHCONI		;Now read RH CONI, result to T1
	TRNN T1,.RHMBE		;Did the enable bit come back?
	JRST FDSK4		;No.  No bit means no channel.
;This channel exists.
;;	MAP T1,ICCW		;Get physical address of ICCW
;;	TLZ T1,777760		;Keep 22 phys addr bits
	MOVEI T1,ICCW		;set up physical address of CCW list (map is off)
	TLO T1,(<1B1>)		;Make a JUMP CCW
	MOVE T2,P1		;Get the current channel number
	LSH T2,2		;Shift it to Channel*4
	MOVEM T1,KLEPT+ICA(T2)	;Store initial CCW for channel
;Scan to see what physical units are present.
	MOVEI P2,0		;Start at unit 0
;Start on a Unit.  Unit number in P2
FDSK2:	MOVSI T1,(<R4%DTR>)	;Read the Drive Type register
	CALL RHREAD		;Read it
	MOVE T2,T1		;Copy Drive Type to T2
	CALL RHCONI		;Check for Register Access Error
	TRNN T1,.RHRAE		;Test CONI bits for RAE
	JRST FDSK2A		;All is well: a drive responded
	MOVEI T1,.RHRAE!.RHMBE	;Must clear RAE.  Set ENABLE.
	CALL RHCONO		;CONO to clear RAE & set ENABLE
	JRST FDSK3		;Drive doesn't exist.  Try next.

;A unit is present.  See what kind of drive it is.  GOTDRV does the real work.
FDSK2A:	CALL GOTDRV		;See what we have here
FDSK3:	CAIGE P2,MAXDRV-1	;Done with all units yet?
	AOJA P2,FDSK2		;No, go do next unit now.
FDSK4:	CAIGE P1,MAXCHN-1	;Checked all channels yet?
	AOJA P1,FDSK1		;No, advance to next channel
;Now see if we found a consistent structure.
	SKIPGE T1,MAXUNI	;Now, check for full structure
	JRST MISSTR		;Structure not found
CHKSTR:	SKIPN DSKTAB(T1)	;Any physical addr for this LUN?
	JRST MISUNI		;Bad structure: missing unit
	SOJGE T1,CHKSTR		;Loop thru all units
	MOVE T2,DSKTYP		;Get the type of this disk
	MOVE T1,[N.STK4,,N.SCL4] ;Get sec/trk,,sectors/cylinders for 04, 05, 06
	CAIN T2,.R3TYP		;RP03?
	MOVE T1,[N.STK3,,N.SCL3] ;Yes
	CAIN T2,.R7TY1		;RP07?
	MOVE T1,[N.STK7,,N.SCL7] ;Yes
	HRRZM T1,NUMSCL		;Save sec/cyl
	HLRZM T1,NUMSTK		;Save sec/trk
	RET			;all done with FDSK

MISSTR:
IFE KLBOOT,<
	MOVEI B,[ASCIZ/Desired structure not found.  /]
>;IFE KLBOOT
IFN KLBOOT,<
	MOVEI B,[ASCIZ/Struct? /]
>;IFN KLBOOT
MISUN2:
IFN DSKDSW,<
	PUSHJ P,TYPE		;type error msg
	SKIPN D,FDEV
	MOVE D,['-ANY-']	;indicate blank structure name, which matches any
	JRST TYPSIX		;type device name
>;IFN DSKDSW
IFE DSKDSW,<
	JRST TYPE		;type error msg and return
>;IFE DSKDSW

MISUNI:
IFE KLBOOT,<
	MOVEI B,[ASCIZ/Structure has unit(s) missing.  /]
>;IFE KLBOOT
IFN KLBOOT,<
	MOVEI B,[ASCIZ/Units? /]
>;IFN KLBOOT
	SETZM DIORG		;don't let us try to use this structure
	JRST MISUN2		;type error msg and return
;⊗ GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2

SUBTTL	GOTDRV	Examine the Drive and HHome Block to see if we want it

;Initially DSKTYP is zero.  When we find the first disk, we set DSKTYP to the
;negative of the drive type number.  If we like the home blocks, we set
;DSKTYP to positive and thereafter, we look at only physical units that are
;similar.
GOTDRV:	ANDI T2,R4%TYP		;Keep only the device type code
	CAIN T2,.R5TYP		;Is this an RP05?
	MOVEI T2,.R4TYP		;Yes, make it look like an RP04
IFE KLBOOT,<	;squeeze into KLDCP
	CAIN T2,.R7TY2		;Alternate kind of RP07?
	MOVEI T2,.R7TY1		;Make it the usual kind of RP07
>;IFE KLBOOT
	SKIPG T1,DSKTYP		;Are we looking for a specific disk?
	JRST GOTDV3		;Not yet, check if this is allowable
	CAMN T2,T1		;Yes.  Is this the same as we want?
	JRST GOTDV0		;Same as we want.  Read its home block.
	RET			;No.  Don't use this one.

;The desired Drive Type has not been selected yet.  Check type against all known
;disk types:

GOTDV3:	CAIE T2,.R7TY1		;RP07?
	CAIN T2,.R3TYP		;or RM03?
	JRST GOTDV4		;Yes
	CAIE T2,.R6TYP		;RP06
	CAIN T2,.R4TYP		;or RP04?
	JRST GOTDV4		;Yes.  Save type (negated)
	RET			;This is no kind of disk for us

GOTDV4:	MOVNM T2,DSKTYP		;Save negative drive type till home blocks checked
GOTDV0:	MOVE T1,[R4%CSR!LR!R4%CPA] ;Send Pack Acknowledge.
	CALL RHWRIT		;Do DATAO.  Sets Volume Valid
	MOVSI T1,(<R4%DSR>)	;Read device status register
	CALL RHREAD		;Via DATAO/DATAI
	TRNN T1,.RPMOL		;Is Disk Pack On-Line?
	RET			;No.  Forget it.
	SETZM A%FP0		;Clear data page
	MOVE T1,[A%FP0,,A%FP0+1] ;Set up for the BLT
	BLT T1,A%FP0+PAGSIZ-1	;Zero data page before the Read
	CALL RD0		;Read disk page 0 (records 0,1,2,3)
	CALL CHKHOM		;Check the home block
	 JRST GOTDV2		;Bad.  Try the Backup home block
	 RET			;Good block, but wrong Structure
	MOVMS DSKTYP		;Good block, right structure, set DSKTYP positive
	RET

;Primary Home Block was bad.  Try reading the Backup home block.
;CHKHOM expects to see the home block in record 1 (words 200:377) of the page.
;So we position the backup home block in record 1 of the page, by starting
;the transfer at record 11.  Then record 12 will wind up at words 200:377
GOTDV2:	CALL RD11		;Read records 11,12,13,14
	CALL CHKHOM		;Check the backup home block
	 RET			;Error
	 RET			;Wrong structure
	MOVMS DSKTYP		;OK, set DSKTYP positive.
	RET
;⊗ RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO

;RH20 Register Read and Write, CONO and CONI.  Call with P1 = RH #

;An RH20 register is read by DATAO'ing the specified register number to the RH
;and then DATAI'ing the RH.  An RH20 register is written by DATAO'ing the
;specified register number, the LR (load register) bit, and the remainder of
;the data to the RH.  After writing the register, a DATAI is performed to
;read the new contents.

RHREAD:	TLZ T1,(<LR>)		;Clear LR bit
RHWRIT:	TSO T1,P2		;Insert Drive Number in left half
	CALL XIO1		;Set IO Device Field & do DATAO
	 DATAO .-.,T1		;Send register select & data to device
	CALL XIO1		;Set IO Device Field & do DATAI
	 DATAI .-.,T1		;Read selected register
	RET

RHCONI:	CALL XIO1		;Set IO device and do CONI
	 CONI .-.,T1		;Read device status
	RET

RHCONO:	CALL XIO1		;Set IO device and do CONO
	 CONO .-.,(T1)		;Set device conditions
	RET

;XIO1 Subroutine
;	Call with P1 = channel number
;	next instruction should be:  IOOP 0,Address
;
;	Effect of routine is to execute the specified I/O instruction as
;	though its device code field were set for the given channel number.

XIO1:	PUSH P,@(P)		;Fetch argument, to top of stack
	AOS -1(P)		;Skip once to skip over the argument
	PUSH P,T3		;Save AC T3
	MOVEI T3,<RH0/4>(P1)	;Produce I/O device code
	DPB T3,[POINT 7,-1(P),9] ;Store IO Device Number in instruction
	POP P,T3		;Restore AC
	XCT (P)			;Execute the target instruction
	 CAIA			;Target didn't skip
	AOS -1(P)		;Target skipped.  Pass the Skip upwards.
	ADJSP P,-1		;Discard the stacked instruction
	RET

;RD0:	Routine to read page 0 (Records 0,1*,2,3)  *=home block
;RD11:	Routine to read back home block (Records 11,12*,13,14)
;
; Accepts in P1/ Channel number
;	     P2/ Unit number
;	   ICCW/ Channel command word (memory address and length of xfer in words)
;		 CALL RD0
;
;RDDISK: above args plus:
;	     T1/ Cylinder number
;	     P4/ Position word

;Enter here with cylinder number in T1
RDDISK:	MOVEM T1,RH2CYL		;save cylinder number till we need it
	MOVEI T3,NRETRY		;Initialize Retry counter
	JRST RD0A		;Join RD0 but avoid recalibrate

RD11:	SKIPA P4,[.RHSBR!LR!0B27!11B35]	;Desired Sector and track
RD0:	MOVE P4,[.RHSBR!LR!0B27!0B35]	;For RH20 SBAR
	SETZM RH2CYL		;select cylinder 0
	MOVEI T3,NRETRY		;Initialize Retry counter
;This is where we come to retry losing disk ops, starting with a recalibrate.
RD00:	MOVE T1,[R4%CSR!LR!R4%CRC] ;Recalibrate function
	CALL RHWRIT		;Execute Recalibrate
RD0A:	MOVSI T1,(<R4%DSR>)	;Select unit status register
	CALL RHREAD		;Get drive status
	TRNN T1,.RPDRY		;Is drive ready?
	JRST RD0A		;No, wait till recalibrate done
	MOVE T1,[R4%CSR!LR!R4%RIP] ;Read-in Preset Function
	CALL RHWRIT		;Execute read-in preset
	SETZM ICCW+1		;End command list with a HALT
	MOVE P3,[.RHSTR!LR!RCLP!STLW!R4%CRD] ;Write a disk READ cmd into the STCR
	LDB T1,[POINT 11,ICCW,13] ;get word count from CCW
	ADDI T1,RECSIZ-1	;round up to whole sectors
	LSH T1,-R2WLSH		;shift count to make it a sector count
	MOVN T1,T1		;negative sector count
	DPB T1,[POINT 10,P3,29] ;put negative sector count in disk READ cmd

;Do a data transfer operation with disk
; Accepts in P3/	DATAO Data		;Data Xfer command for STCR
;	     P1/	Channel number
;	     P2/	Unit number
;	     P4/	Position select word	;For the SBAR
;	     RH2CYL/	Desired cylinder

	HRRZ T1,RH2CYL		;get desired cylinder number
	TLO T1,(LR!R4%DC)	;set up DATAO word to select cylinder
	CALL RHWRIT		;Write DC, selecting desired cylinder
	MOVE T1,P4		;Get Block Address Word
	CALL RHWRIT		;Write it to SBAR
	MOVE T1,P3		;Get the TCR word
	CALL RHWRIT		;Write STCR.  Start Xfer.
	MOVEI T2,TIMOUT		;Get timeout count
DOOP1:	CALL RHCONI		;Get RH status
	TRNN T1,.RHDON		;RH done?  Is operation done?
	SOJG T2,DOOP1		;No.  Loop till done or timeout
	MOVE P3,T1		;Copy final CONI (unused??)
	MOVEI T1,.RHRAE!.RHCTE!.RHMBE!.RHDON ;Clear Done and errors
	CALL RHCONO		;Via CONO to RH
	JUMPLE T2,DOOP2		;Did operation ever finish?
	MOVSI T1,(<R4%DSR>)	;Yes.  Read disk status
	CALL RHREAD		;Get device status
	TRNE T1,.RPERR		;Check composite error flag
	JRST DOOP2		;Some drive-detected error
	CALL RHCONI		;Get RH status bits
IFE KLBOOT,<	;squeeze into KLDCP
	AOS NDSKOP		;count disk ops, successful or not
>;IFE KLBOOT
IFE TYPXFR,<
	TRNN T1,RHERR		;Any errors there?
	RET			;No errors.  Return.
>;IFE TYPXFR
IFN TYPXFR,<
	TRNE T1,RHERR		;Any errors there?
	JRST DOOP2		;Yes, try again
	MOVEI C,"+"		;indicate successful disk op
	MOVE T3,NDSKOP		;get disk op count
	SUB T3,NDSKLZ		;only count winners, discount losers
TYPGOO:	TRNN T3,000000		;patch this to limit dot typeout to every 2↑Nth op
	PUSHJ P,TYO		;type char for each successful disk op
	RET			;No errors.  Return.

>;IFN TYPXFR
DOOP2:	MOVEI T1,.RHMBR!.RHMBE!.RHCTE!.RHSTP ;Here if errors.  Setup CONO:
	CALL RHCONO		;Massbus Reset and Enable bits
	MOVEI T1,.RHMBE		;Get Massbus Enable
	CALL RHCONO		;Enable Channel
	MOVE T1,[R4%ATN!LR!377] ;Select Attention Register
	CALL RHWRIT		;Clear Attention in all drives
IFE KLBOOT,<	;squeeze into KLDCP
	AOS T1,NDSKLZ		;count losing disk ops
>;IFE KLBOOT
IFN TYPXFR,<
	MOVEI C,"-"		;indicate losing disk op
TYPFOO:	TRNN T1,000000		;patch this to limit typeout to every 2↑Nth error
	PUSHJ P,TYO		;type char for each losing disk op
>;IFN TYPXFR
	SOJG T3,RD00		;Repeat failing operation
	RET			;Catch errors elsewhere
;⊗ CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2

;Check for correct home blocks
;	no skip:	bad home block
;	one skip:	wrong structure
;	two skips:	OK

CHKHOM:	MOVS T1,HOMNAM		;Get block name
	CAIE T1,'HOM'		;Does it say SIXBIT/HOM/ ?
	RET			;Bad.
	MOVE T1,HOMCOD		;Get block type code
	CAIE T1,CODHOM		;Check it (707070)
	RET			;Bad home block
	MOVE T1,HOMFSN		;Get file system type, chars 1-4
	CAME T1,[BYTE (2)0(8)" "," "(2)0(8)"A","W"]
	RET			;Not a WAITS pack
	MOVE T1,HOMFSN+1	;Get characters 5-8 of type
	MOVE T2,HOMFSN+2	;Get characters 9-12 of type
	CAMN T1,[BYTE (2)0(8)"T","I"(2)0(8)" ","S"]
	CAME T2,[BYTE (2)0(8)" "," "(2)0(8)" "," "]
	RET			;Not a WAITS pack
	AOS (P)			;At least one skip now.
	MOVE T1,HOMSNM		;Get Structure name
	SKIPN T2,FDEV		;skip if specific structure requested
	JUMPN T1,CHKHO2		;take any structure with Non-Blank name!
	CAME T1,T2		;Does it match what we want?
	RET			;Wrong Structure (one skip)
CHKHO2:	SKIPN STRNAM		;Have we identified structure yet?
	MOVEM T1,STRNAM		;No, save name of structure found
	CAME T1,STRNAM		;Part of same structure already seen?
	RET			;No, wrong Structure
	HRRZ T1,HOMLUN		;Get logical unit number
	CAIL T1,RMXDRV		;Make sure it's in range
	JRST BADUNI		;Out of range!
	SKIPE DSKTAB(T1)	;Is this unit number defined?
	JRST DPLUNI		;Yes.  Bad: Duplicate units
	HRRZM P2,DSKTAB(T1)	;Store Physical Unit number
	MOVEI T2,ENTFLG(P1)	;Phys Channel + entry-used flag
	HRLM T2,DSKTAB(T1)	;Store phys channel + flag
	HLRZ T1,HOMLUN		;Get number of units in str
	SOS T1			;Convert to maximum unit #
	SKIPGE MAXUNI		;Is MAXUNI already set?
	MOVEM T1,MAXUNI		;No: set it now.
	CAME T1,MAXUNI		;Is this unit the same as others?
	JRST BADSTR
	MOVE T2,HOMRXB		;Get MFD address
	SKIPN DIORG		;Is MFD addr already set?
	MOVEM T2,DIORG		;No.  Set it.
	CAME T2,DIORG		;Must be same as any previous
	JRST BADSTR		;But it isn't.  Bad: home blocks are inconsistent
	JRST CPOPJ1		;Another skip.  A good pack

IFE KLBOOT,<
BADUNI:	MOVEI B,[ASCIZ/Unit number out of range./]
	JRST BADUN2

DPLUNI:	MOVEI B,[ASCIZ/Different drives claim same logical unit number./]
	JRST BADUN2

BADSTR:	MOVEI B,[ASCIZ/Inconsistent home blocks on different drives./]
>;IFE KLBOOT
IFN KLBOOT,<
BADUNI:
DPLUNI:
BADSTR:	MOVEI B,[ASCIZ/CHKHOM? /]
>;IFN KLBOOT
BADUN2:	PUSHJ P,TYPE
	JRST 4,.

>;IFN RHDSK
;⊗ FF

;XLIST	 ;LIT and VAR listing suppressed here
	LIT
	VAR
LIST	;resume listing
FF←←.

IFN DSKDSW,<
IFE DEBSW,<
	END DSKDMP
>;IFE DEBSW
IFN DEBSW,<
	END 300
>;IFN DEBSW
>;IFN DSKDSW

IFE DSKDSW,<
IFE KLBOOT,<
IFN DEBSW,<
	END BOOT
>;IFN DEBSW
IFE DEBSW,<
	END PNCHGO
>;IFE DEBSW
>;IFE KLBOOT
IFN KLBOOT,<
	END BOOT
>;IFN KLBOOT
>;IFE DSKDSW